package fr.upstlse.glre.server.controler;

import java.util.List;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

import fr.upstlse.glre.business.ServiceLocator;
import fr.upstlse.glre.business.domain.user.UserRole;
import fr.upstlse.glre.business.service.user.EtudiantService;
import fr.upstlse.glre.business.service.user.UserService;
import fr.upstlse.glre.business.vo.user.EtudiantSearchCriteriaVO;
import fr.upstlse.glre.business.vo.user.EtudiantVO;
import fr.upstlse.glre.business.vo.user.UserSearchCriteriaVO;
import fr.upstlse.glre.business.vo.user.UserVO;
import fr.upstlse.glre.client.controler.ControlerService;
import fr.upstlse.glre.client.vo.EtudiantVOGWT;
import fr.upstlse.glre.client.vo.UserVOGWT;

public class ControlerServiceImpl extends RemoteServiceServlet implements
		ControlerService {

	/**
	 * 
	 */
	private static final long serialVersionUID = -4162588882511003821L;

	private ServiceLocator serviceLocator;
	private UserService userService;
	private EtudiantService etudiantService;

	public ControlerServiceImpl() {
		serviceLocator = ServiceLocator.instance();
		userService = serviceLocator.getUserService();
		etudiantService = serviceLocator.getEtudiantService();
	}

	public EtudiantVOGWT findEtudiant(String pLogin, String pPassword) {
		EtudiantSearchCriteriaVO lEtudiantSearchCriteriaVO = new EtudiantSearchCriteriaVO(
				pLogin, pPassword);

		List<EtudiantVO> lEtudiants = etudiantService
				.findEtudiant(lEtudiantSearchCriteriaVO);
		if (lEtudiants.size() == 1) {
			return etudiantVOToEtudiantVOGWT(lEtudiants.get(0));
		} else {
			return new EtudiantVOGWT();
		}
	}

	public UserVOGWT findUser(String pLogin, String pPassword) {
		UserSearchCriteriaVO lUserSearchCriteriaVO = new UserSearchCriteriaVO(
				pLogin, pPassword);

		List<UserVO> lUserFinded = userService.findUser(lUserSearchCriteriaVO);

		if (lUserFinded.size() == 1) {
			return userVOToUserVOGWT(lUserFinded.get(0));
		} else {
			return new UserVOGWT();
		}
	}

	private static UserVOGWT userVOToUserVOGWT(UserVO pUserVO) {
		return new UserVOGWT(pUserVO.getId(), pUserVO.getLogin(), pUserVO
				.getPassword(), pUserVO.getRole().getValue());
	}

	private static EtudiantVOGWT etudiantVOToEtudiantVOGWT(
			EtudiantVO pEtudiantVO) {
		return new EtudiantVOGWT(pEtudiantVO.getNom(), pEtudiantVO.getPrenom(),
				pEtudiantVO.getEmail(), pEtudiantVO.getTelephonefixe(),
				pEtudiantVO.getTelephoneportable(), pEtudiantVO
						.getAdressenumero(), pEtudiantVO.getAdressevoie(),
				pEtudiantVO.getAdressecodepostal(), pEtudiantVO
						.getAdresseville(), pEtudiantVO.getAdressepays(),
				pEtudiantVO.getId(), pEtudiantVO.getLogin(), pEtudiantVO
						.getPassword(), pEtudiantVO.getRole().getValue());
	}

	private static EtudiantVO etudiantVOGWTToEtudiantVO(
			EtudiantVOGWT pEtudiantVOGWT) {

		return new EtudiantVO(pEtudiantVOGWT.getNom(), pEtudiantVOGWT
				.getPrenom(), pEtudiantVOGWT.getEmail(), pEtudiantVOGWT
				.getTelephonefixe(), pEtudiantVOGWT.getTelephoneportable(),
				pEtudiantVOGWT.getAdressenumero(), pEtudiantVOGWT
						.getAdressevoie(), pEtudiantVOGWT
						.getAdressecodepostal(), pEtudiantVOGWT
						.getAdresseville(), pEtudiantVOGWT.getAdressepays(),
				pEtudiantVOGWT.getId(), pEtudiantVOGWT.getLogin(),
				pEtudiantVOGWT.getPassword(), UserRole
						.fromString(pEtudiantVOGWT.getRole()));

	}

	public void updateEtudiant(EtudiantVOGWT pEtudiant) {
		etudiantService.updateEtudiant(etudiantVOGWTToEtudiantVO(pEtudiant));
	}

}